/**
 * Clase que contiene el formulario de asignación de planes y beneficiarios
 */ 
qx.Class.define("mutual.formAsignacion", {
	extend : qx.ui.groupbox.GroupBox,

	construct : function() {

		this.base(arguments);
		this.setLayout(new qx.ui.layout.VBox(5));

		
		/* ################### FILTRO DE PERSONAS ################### */
		var filterPersonas = new mutual.filterPersonas(20, function(){
			// TODO: show data personas
			var idTitular = filterPersonas.getSelectedEntity().value;
			abmPlanesTitular.getData = function() { 
				var rpc = new qx.io.remote.Rpc("services/", "mutual.Asignacion");
				var planesTitular = (idTitular) ? rpc.callSync("getPlanesForTitular", idTitular) : null;
				return planesTitular;
			}
			abmPlanesTitular.loadGrid();
			abmBeneficiarios.clearDataGrid();
		});
		this.add(filterPersonas);
		
		this.grpGrids = new qx.ui.container.Composite();
		this.grpGrids.setLayout(new qx.ui.layout.HBox(5));
		
		/* ################### ABM DE PERSONA-PLAN ################### */
		var dataModelPlanes = {
			fields : ["id", "Titular", "Plan"], 
			titles : ["id_persona_plan","nombre_titular", "nombre_plan"]
		}
		var abmPlanesTitular = new mutual.abm(dataModelPlanes, null, null);
		abmPlanesTitular.setWidth(450);
		abmPlanesTitular.tblGrid.getTableColumnModel().setColumnWidth(1, 200);
		abmPlanesTitular.tblGrid.getTableColumnModel().setColumnWidth(2, 200);
		abmPlanesTitular.tblGrid.getTableColumnModel().setColumnVisible(0, false);
		abmPlanesTitular.tblGrid.setHeight(150);
		abmPlanesTitular.tblGrid.getSelectionModel().addListener("changeSelection", function() {
					var idPersonaPlan = abmPlanesTitular.tblModel.getValue(0, abmPlanesTitular.tblGrid.getFocusedRow());
					abmBeneficiarios.getData = function(){
						var rpc = new qx.io.remote.Rpc("services/", "mutual.Asignacion");
						var beneficiarios = rpc.callSync("getBeneficiarios", idPersonaPlan);
						return beneficiarios;
					}
					abmBeneficiarios.loadGrid();
				}, this);
		
		var frmAsignacion = this;
		abmPlanesTitular.initForm = function(nuevo){
			var win = frmAsignacion.getModalWindow("Asignacion de Plan a Titular");
			var idPersona = filterPersonas.getSelectedEntity().value;
			if (!idPersona) {
				alert("Debe Seleccionar una Persona");
				return;
			}
			var frmPersonaPlan;
			if (nuevo) {
				frmPersonaPlan = new mutual.formPersonaPlan(idPersona);
			} else {
				var idPersonaPlan = abmPlanesTitular.getSelectedId();
				if (!idPersonaPlan){
					alert("Debe seleccionar un Plan asignado a una Persona");
					return;
				}
				frmPersonaPlan = new mutual.formPersonaPlan(idPersona, idPersonaPlan);
			}
			frmPersonaPlan.persistSuccess = function() {
							abmPlanesTitular.loadGrid();
							win.close();
						};
			frmPersonaPlan.addListener("cancelar", function() {
				win.close();
			}, this);
			win.add(frmPersonaPlan);
			win.open();
		}
		
		abmPlanesTitular.deleteAction = function(){
			var idPersonaPlan = abmPlanesTitular.getSelectedId();
			if (!idPersonaPlan){
					alert("Debe seleccionar un Plan asignado a una Persona");
					return;
				}
			if (!confirm("Esta seguro que desea borrar este registro?")) {
				return;
			}
			var rpc = new qx.io.remote.Rpc("services/","mutual.Asignacion");
			var response = rpc.callSync("deletePersonaPlan", idPersonaPlan);

			abmPlanesTitular.loadGrid();
			abmBeneficiarios.clearDataGrid();
		}
		
		/* ################### ABM DE BENEFICIARIOS ################### */
		var dataModelBeneficiarios = {
			fields : ["id", "Nombre", "Apellido", "Parentesco"],
			titles : ["id_beneficiario", "nombre", "apellido", "tipo_parentesco"]
		}; 
		var abmBeneficiarios = new mutual.abm(dataModelBeneficiarios, null, null);
		abmBeneficiarios.setWidth(450);
		abmBeneficiarios.tblGrid.getTableColumnModel().setColumnWidth(1, 150);
		abmBeneficiarios.tblGrid.getTableColumnModel().setColumnWidth(2, 100);
		abmBeneficiarios.tblGrid.getTableColumnModel().setColumnWidth(3, 150);
		abmBeneficiarios.tblGrid.getTableColumnModel().setColumnVisible(0, false);
		abmBeneficiarios.tblGrid.setHeight(150);
		abmBeneficiarios.initForm = function(nuevo){
			var win = frmAsignacion.getModalWindow("Asignacion de Beneficiario");
			var frmBeneficiario;
			var idPersonaPlan = abmPlanesTitular.getSelectedId();
			if (!idPersonaPlan) {
				alert("Debe Seleccionar un Plan asignado a una Persona");
				return;
			}
			var personaPlan = frmAsignacion.getPersonaPlan(idPersonaPlan);
			if (nuevo) {
				frmBeneficiario = new mutual.formBeneficiario(personaPlan.tipo_seguro, idPersonaPlan);
			} else {
				var idBeneficiario = abmBeneficiarios.getSelectedId();
				if (!idBeneficiario){
					alert("Debe Seleccionar un Beneficiario");
					return;
				}
				frmBeneficiario = new mutual.formBeneficiario(personaPlan.tipo_seguro, idPersonaPlan, idBeneficiario);
			}
			frmBeneficiario.persistSuccess = function() {
							abmBeneficiarios.loadGrid();
							win.close();
						};
			frmBeneficiario.addListener("cancelar", function() {
				win.close();
			}, this);
			win.add(frmBeneficiario);
			win.open();
		}
		
		abmBeneficiarios.deleteAction = function(){
			var idBeneficiario = abmBeneficiarios.getSelectedId();
			if (!idBeneficiario){
					alert("Debe Seleccionar un Beneficiario");
					return;
				}
			if (!confirm("Esta seguro que desea borrar este registro?")) {
				return;
			}
			var rpc = new qx.io.remote.Rpc("services/","mutual.Asignacion");
			var response = rpc.callSync("deleteBeneficiario", idBeneficiario);

			abmBeneficiarios.loadGrid();
		}
		
		/* ################### BUSCADOR DE RELACIONES POR PERSONA ################### */
		var btnIniciarBuscador = new qx.ui.form.ToggleButton("Buscar");
		btnIniciarBuscador.addListener("changeValue", function(e){
			var visible = e.getData();
			grpBuscador.setVisibility((visible)? "visible" : "excluded");
			filterPersonas.setEnabled(!visible);
			abmPlanesTitular.setEnabled(!visible);
			abmBeneficiarios.setEnabled(!visible);
			if (!visible){
				filterRelaciones.clearValue();
			}
			filterPersonas.reload();
			filterRelaciones.reload();
		}, this);
		
		var grpBuscador = new qx.ui.groupbox.GroupBox("Buscar");
		grpBuscador.setLayout(new qx.ui.layout.VBox(10));
		grpBuscador.setVisibility("excluded");
		
		// definimos la grilla
		var tblModel = new qx.ui.table.model.Simple();
		tblModel.setColumns(
			["Plan Asignado", "id Titular", "Titular", "Plan", "id Beneficiario", "Beneficiario/Asegurado"],
			["id_persona_plan", "id_titular", "nombre_titular", "nombre_plan", "id_beneficiario", "nombre_beneficiario"]
		);
		var tblGridRelaciones = new qx.ui.table.Table(tblModel);
		tblGridRelaciones.getTableColumnModel().setColumnVisible(0, false);
		tblGridRelaciones.getTableColumnModel().setColumnVisible(1, false);
		tblGridRelaciones.getTableColumnModel().setColumnVisible(4, false);
		tblGridRelaciones.getTableColumnModel().setColumnWidth(2, 280);
		tblGridRelaciones.getTableColumnModel().setColumnWidth(3, 280);
		tblGridRelaciones.getTableColumnModel().setColumnWidth(5, 280);
		tblGridRelaciones.setHeight(150);
		tblGridRelaciones.addListener("cellDblclick", function(e){
			var idPersonaPlan = parseInt(tblModel.getValue(0, tblGridRelaciones.getFocusedRow()));
			var idTitular = parseInt(tblModel.getValue(1, tblGridRelaciones.getFocusedRow()));
			var idBeneficiario = parseInt(tblModel.getValue(4, tblGridRelaciones.getFocusedRow()));
			// seteamos el filtro con el titular
			filterPersonas.setPersona(idTitular);
			// seleccionamos la fila del Plan con el titular
			abmPlanesTitular.setSelectedId(idPersonaPlan);
			// cargamos la filas en la grilla de beneficiarios
			abmBeneficiarios.getData = function(){
				var rpc = new qx.io.remote.Rpc("services/", "mutual.Asignacion");
				var beneficiarios = rpc.callSync("getBeneficiarios", idPersonaPlan);
				return beneficiarios;
			}
			abmBeneficiarios.loadGrid();
			abmBeneficiarios.setSelectedId(idBeneficiario);
			// limpiamos el filtro
			btnIniciarBuscador.fireEvent("execute");
		}, this);

		
		// definimos el filtro
		var filterRelaciones = new mutual.filterPersonas(10, function(){
			var idPersona = filterRelaciones.getSelectedEntity().value;
			var relaciones = (idPersona)? frmAsignacion.getRelationsForPerson(idPersona) : null;
			if (relaciones){
				tblGridRelaciones.getTableModel().setDataAsMapArray(relaciones);
			}else{
				tblGridRelaciones.getTableModel().setData("");
			}
		});
		
		filterRelaciones.addListener("borrado", function(){
			// borramos el filtro de personas por si esta seleccionado el que se fue eliminado
			filterPersonas.clearValue();
		}, this);
		
		/* ################### ADICION DE ELEMENTOS ################### */
		grpBuscador.add(filterRelaciones);
		grpBuscador.add(tblGridRelaciones);
		
		this.grpGrids.add(abmPlanesTitular);
		this.grpGrids.add(abmBeneficiarios);
		
		this.add(this.grpGrids);
		this.add(btnIniciarBuscador);

		this.add(grpBuscador);
	},
	members : {
		grpFiltroPersona : null,
		filterPersona : null,
		btnAbmPersona : null,
		
		/**
		 * Obtiene la persona-plan especificada
		 * 
		 * @param (int) idPersonaPlan: Id de persona-plan que se desea recuperar
		 * 
		 * @return (json object) persona-plan
		 */		
		getPersonaPlan : function(idPersonaPlan){
			var rpc = new qx.io.remote.Rpc("services/", "mutual.Asignacion");
			var personaPlan = rpc.callSync("getPersonaPlan", idPersonaPlan);
			return personaPlan;
		},
		/**
		 * Obtiene una ventana
		 * 
		 * @param (string) title: título que se desea mostrar en la ventana
		 * 
		 * @return (qx.ui.window.Window) Ventana
		 */	
		getModalWindow : function(title){
			 var win = new qx.ui.window.Window((title)? title : "");
			 win.setLayout(new qx.ui.layout.VBox(5));
			 win.setModal(true);
			 win.setShowMinimize(false);
			 win.addListener("resize",function(){
				win.center();
			 }, win);
			 return win;
	    },
	    
	    /**
		 * Obtiene la lista de relaciones de una persona; ya sea como titular de un plan o beneficiario de un titular
		 * 
		 * @param (int) idPersona: Id de persona de la que se desea conocer sus relaciones
		 * 
		 * @return (Array) relaciones
		 */	
	    getRelationsForPerson : function (idPersona){
			var rpc = new qx.io.remote.Rpc("services/","mutual.Asignacion");
			var relaciones = rpc.callSync("getRelaciones", idPersona);
			return relaciones;	    	
	    },
	    
	    getId : function(method, msj){
	    	var id;
	    	try{
	    		id = method();
	    		return id;
	    	}catch(x){
	    		alert(msj);
	    	}
	    }
	}
});
